//@ts-check
'use strict'
import { isObject } from "../common";

function _proxy(target){
    var ntarget = isObject(target)?target:{};

    var proxy = new Proxy(ntarget,{
        get(obj,prop){
            if(prop==='unproxy'){
                return ()=>target;
            }
            var val = obj[prop]
            return _proxy(val)
        }
    })
    return proxy;
}

/**
 * 代理对象，适用链式取值 a.b.c，b可能为undefined，导致报错
 * 代理对象使用unproxy() 返回原则
 * @example 
 * // returns undefined
 * $rxTool.object.proxy({a:{b:1}}).a.b.c.d.e.f.unproxy()
 * @example
 * // returns 1
 * $rxTool.object.proxy({a:{b:1}}).a.b.unproxy()
 * @example
 * // returns true
 * var a={b:2}
 * $rxTool.object.proxy(a).unproxy()===a
 * @param {Object} target 要代理的对象
 * @returns {Proxy} 新的代理
 */
export var proxy =  function(target){
    if(isObject(target)&&target.unproxy){
        throw new Error('unproxy 是proxy的关键函数，与目标对象属性冲突。')
    }
    return _proxy(target);
}

// var obj={a:{b:1}}
// var proxyObj = proxy(obj)
// console.log(proxyObj);
// console.log(proxyObj.a);
// console.log(proxyObj.a.unproxy());
// console.log(proxyObj.a.b);
// console.log(proxyObj.a.b.unproxy());
// console.log(proxyObj.a.b.c);
// console.log(proxyObj.a.b.c.unproxy());
// console.log(proxyObj.a.b.c.d);
// console.log(proxyObj.a.b.c.d.unproxy());